home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
UNIXTOOL
/
GNU
/
TILEFORTH
/
TILE
/
TILE~
/
!Tile
/
test
/
queues1
< prev
next >
Wrap
Text File
|
1992-04-19
|
3KB
|
145 lines
#include <tile$lib>.structures
#include <tile$lib>.blocks
memory locals string blocks structures queues definitions
struct.type QUEUE ( -- )
ptr +succ ( queue -- addr) private
ptr +pred ( queue -- addr) private
ptr +name
long +id
struct.init ( queue -- )
dup over +succ ! dup +pred !
struct.end
: succ ( queue -- succ)
+succ @
;
: pred ( queue -- pred)
+pred @
;
: size-queue ( queue -- num)
0 swap dup >r ( Save pointer to queue header)
begin
swap 1+ swap +succ @ ( Increment size and step to next)
dup r@ = ( Is this the last element?)
until
r> 2drop ( Drop parameters and return size)
;
: map-queue ( queue block[item -- ] -- )
over >r ( Save pointer to queue header)
begin
over +succ @ >r ( Save pointer to next item)
dup >r ( Save block on return stack)
call ( Call the block with the item)
2r> tuck ( Restore the parameters)
r@ = ( Check if end of queue)
until
r> drop 2drop ( Drop all temporary parameters)
;
: ?map-queue ( queue block[item -- bool] -- )
over >r ( Save pointer to queue header)
begin
over +succ @ >r ( Save pointer to next item)
dup >r ( Save block on return stack)
call ( Call the block with the item)
if 2r> true ( Exit the iteration)
else
2r> tuck ( Restore the parameters)
r@ = ( Check if end of queue)
then
until
r> drop 2drop ( Drop all temporary parameters)
;
: ?member-queue ( element queue -- bool)
dup >r ( Save pointer to queue header)
begin
2dup = ( Is this the element?)
if 2drop r> drop true exit then ( Well drop the parameters and return)
+succ @ dup r@ = ( Step to the next. Last element?)
until
r> drop 2drop false
;
: print-entry ( queue -- )
dup +name @ $print space +id @ . ;
: print-queue ( queue -- )
block[ print-entry cr ]; map-queue
;
variable queue.head
: add-id { name id | queue -- }
16 malloc -> queue
queue as QUEUE initiate
name queue +name !
id queue +id !
queue.head @
if
queue queue.head @ enqueue
else
queue queue.head !
then
;
: locate-id { id | p queue -- q }
nil -> queue
queue.head @
if
queue.head @ dup -> p
size-queue 0
do
p +id @ id =
if
p -> queue leave
else
p succ -> p
then
loop
then
queue
;
: remove-entry ( queue -- )
dup dequeue free
;
: setup-head
nil queue.head !
;
forth only
string queues
setup-head
.( Add some initial entries...) cr
" Peter" 1 add-id
" Derek" 2 add-id
" Tom" 3 add-id
.( Print out entries...) cr
queue.head @ print-queue
.( Locate some entries...) cr
3 locate-id print-entry cr
1 locate-id print-entry cr
.( Bump off one entry...) cr
1 locate-id remove-entry
queue.head @ print-queue
bye